package controladores;


import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Vector;

import javax.swing.JOptionPane;
import bean.AlumnoVO;
import bean.DireccionVO;
import bean.MateriaVO;
import bean.ProfesorVO;
import gui.*;
import client.BDelegate;

public class ControladorAdmin {

	//private static ControladorAdmin ins; 
	private AdministracionGui vistaAdmin;
	private MainGui vistaMain;
	private BDelegate modelo;
	
/*	
public static ControladorAdmin getIns(AdministracionGui v, MainGui vm){
	if(ins == null)
		ins = new ControladorAdmin(v);
	return ins;
	
}
	*/
	
public ControladorAdmin(AdministracionGui v , MainGui vm){
	try {
		modelo = new BDelegate();
	} catch (RemoteException e) {
		e.printStackTrace();
	}
	this.vistaAdmin = v;
	this.vistaMain = vm;
	vistaAdmin.setControlador(this);
	actualizarMaterias();
	actualizarAlumnos();
	actualizarProfesores();
	
}

public void salir(){
	
	vistaAdmin.dispose();
	vistaMain.activarBotonAdmin();
	vistaMain.activarBotonAsign();
}


//Materias

public  void procesarSeleccionMateria(String num){
	MateriaVO aux = new MateriaVO();
	aux.setNumero(num);
	MateriaVO m = modelo.buscarMateria(aux);
	String nombre = m.getNombre();
	String numero = m.getNumero();
	vistaAdmin.mostrarAtributosMateria(numero, nombre);
	
}

public void procesarAgregarMateria(String num, String nombre){

	      MateriaVO nueva = new MateriaVO();
	      nueva.setNombre(nombre);
	      nueva.setNumero(num);
	      
	      if (modelo.existeMateria(nueva)){
	    	  int sel = JOptionPane.showConfirmDialog(null, "La Materia ya existe.\n Desea actualizarla ?" , "Materia Existente" , JOptionPane.OK_CANCEL_OPTION);
		    		if(sel != 0)
		    			return;  
		    		else
		    		{	
		    		if(!comprobarAsociacionesMateria(num)) return;		
		    		try {
		 
						modelo.actualizarMateria(nueva);
						
					    } catch (Exception e) {
						mostrarMensajeErrorActualizar();
						return;
					          }
		    	  }
	      }
	      else{
	      
	    	  try {
	    		  modelo.guardarMateria(nueva);
	  
	    	      } catch (Exception e) {
	    		  mostrarMensajeErrorGuardar();
	    		  return;
	    	            }
	        }
	      actualizarMaterias();
        }



public void procesarEliminarMateria(String num){
	MateriaVO aux = new MateriaVO();
	aux.setNumero(num);
    MateriaVO m = modelo.buscarMateria(aux);
    if(!comprobarAsociacionesMateria(num)) return;		
    modelo.eliminarMateria(m);
    actualizarMaterias();
}

public void actualizarMaterias(){
	vistaAdmin.actualizarMaterias(listarMaterias(modelo.obtenerMaterias()));
	
}


//Alumnos

public  void procesarSeleccionAlumno(int leg){
	AlumnoVO aux = new AlumnoVO();
	aux.setLegajo(leg);
	AlumnoVO a = modelo.buscarAlumno(aux);
	int legajo = a.getLegajo();
	String nombre = a.getNombre();
	String estado = a.getEstado();
	vistaAdmin.mostrarAtributosAlumno(legajo, nombre, estado);
	
}

public void procesarAgregarAlumno(int leg, String nombre, String estado){

	      AlumnoVO nuevo = new AlumnoVO();
	      nuevo.setLegajo(leg);
	      nuevo.setNombre(nombre);
	      nuevo.setEstado(estado);
	      
	      if (modelo.existeAlumno(nuevo)){
	    	  int sel = JOptionPane.showConfirmDialog(null, "El Alumno ya existe.\n Desea actualizarlo ?" , "Alumno Existente" , JOptionPane.OK_CANCEL_OPTION);
		    		if(sel != 0)
		    			return;  
		    		else
		    		{	
		    		if(!comprobarAsociacionesAlumno(leg)) return;		
		    		try {
		    			
						modelo.actualizarAlumno(nuevo);
						
					    } catch (Exception e) {
						mostrarMensajeErrorActualizar();
						return;
					          }
		    	  }
	      }
	      else{
	      
	    	  try {
	    		  modelo.guardarAlumno(nuevo);
	  
	    	      } catch (Exception e) {
	    		  mostrarMensajeErrorGuardar();
	    		  return;
	    	            }
	        }
	      actualizarAlumnos();
        }



public void procesarEliminarAlumno(int leg){
	AlumnoVO aux = new AlumnoVO();
	aux.setLegajo(leg);
    AlumnoVO a = modelo.buscarAlumno(aux);
    if(!comprobarAsociacionesAlumno(leg)) return;		
    modelo.eliminarAlumno(a);
    actualizarAlumnos();
}

public void actualizarAlumnos(){
	vistaAdmin.actualizarAlumnos(listarAlumnos(modelo.obtenerAlumnos()));
	
}


//Profesores

public  void procesarSeleccionProfesor(int leg){
	ProfesorVO aux = new ProfesorVO();
	aux.setNroLegajo(leg);
	ProfesorVO p = modelo.buscarProfesor(aux);
	int legajo = p.getNroLegajo();
	String nombre = p.getNombre();
	
	DireccionVO d = p.getDireccionVO();
	String calle = d.getCalle();
	int numero = d.getNumero();
	String codPostal = d.getCodPostal();
	String localidad = d.getLocalidad();
	int piso = d.getPiso();
	String dpto = d.getDepto();
	
	vistaAdmin.mostrarAtributosProfesor(legajo, nombre, calle, numero, codPostal, localidad, piso, dpto);
	
}

public void procesarAgregarProfesor(int leg, String nombre, String calle, int nro, String cp, String loc, int piso, String dpto){
           
          DireccionVO d = new DireccionVO ();
          d.setCalle(calle);
          d.setCodPostal(cp);
          d.setDepto(dpto);
          d.setLocalidad(loc);
          d.setNumero(nro);
          d.setPiso(piso);
          
	      ProfesorVO nuevo = new ProfesorVO(); 
	      nuevo.setNroLegajo(leg);
	      nuevo.setNombre(nombre);
	      nuevo.setDireccionVO(d);
	      
	      if (modelo.existeProfesor(nuevo)){
	    	  int sel = JOptionPane.showConfirmDialog(null, "El Profesor ya existe.\n Desea actualizarlo ?" , "Profesor Existente" , JOptionPane.OK_CANCEL_OPTION);
		    		if(sel != 0)
		    			return;  
		    		else
		    		{	
		    		 if(!comprobarAsociacionesProfesor(leg)) return;			
		    		try {
		    			
						modelo.actualizarProfesor(nuevo);
						
					    } catch (Exception e) {
						mostrarMensajeErrorActualizar();
						return;
					          }
		    	  }
	      }
	      else{
	      
	    	  try {
	    		  modelo.guardarProfesor(nuevo);
	  
	    	      } catch (Exception e) {
	    		  mostrarMensajeErrorGuardar();
	    		  return;
	    	            }
	        }
	      actualizarProfesores();
        }



public void procesarEliminarProfesor(int leg){
	ProfesorVO aux = new ProfesorVO();
	aux.setNroLegajo(leg);
    ProfesorVO p = modelo.buscarProfesor(aux);
    if(!comprobarAsociacionesProfesor(leg)) return;	
    modelo.eliminarProfesor(p);
    actualizarProfesores();
}

public void actualizarProfesores(){
	vistaAdmin.actualizarProfesores(listarProfesores(modelo.obtenerProfesores()));
	
}
// Check

public boolean comprobarAsociacionesMateria(String num){
	
	MateriaVO aux = new MateriaVO();
	aux.setNumero(num);
	
	 if(modelo.existeCursoConMateria(aux)){
	    	JOptionPane.showMessageDialog(null, "Existe Curso para esta materia ", "ERROR", JOptionPane.ERROR_MESSAGE);
			return false;
	    }
	    if(modelo.existeProfesorConMateria(aux)){
	    	JOptionPane.showMessageDialog(null, "Existe Profesor para esta materia ", "ERROR", JOptionPane.ERROR_MESSAGE);
			return false;
	    }
	    return true;
}

public boolean comprobarAsociacionesProfesor(int leg){
	
	ProfesorVO aux= new ProfesorVO();
	aux.setNroLegajo(leg);
	
	if(modelo.existeCursoConProfesor(aux)){
    	JOptionPane.showMessageDialog(null, "Existe Curso para este profesor ", "ERROR", JOptionPane.ERROR_MESSAGE);
		return false;
    }
	   return true;
	
}

public boolean comprobarAsociacionesAlumno(int leg){
	
	AlumnoVO aux = new AlumnoVO();
	aux.setLegajo(leg);
	
	if(modelo.existeCursoConAlumno(aux)){
    	JOptionPane.showMessageDialog(null, "Existe Curso para este alumno ", "ERROR", JOptionPane.ERROR_MESSAGE);
		return false;
    }
	   return true;
}


// to vectorObject (Vector<String>) 

private Vector<Object> listarAlumnos(Vector<AlumnoVO> alumnos){
	
	Vector<Object> salida = new Vector<Object>();
	for (Iterator <AlumnoVO> iter = alumnos.iterator(); iter.hasNext();) {
		AlumnoVO a = (AlumnoVO)iter.next();
		salida.add(a.toVector());	
	}
	return salida;
}

private Vector <Object> listarMaterias(Vector<MateriaVO> materias){

	Vector<Object> salida = new Vector<Object>();
	
	for (Iterator <MateriaVO> iter = materias.iterator(); iter.hasNext();) {
		MateriaVO m = (MateriaVO)iter.next();
		salida.add(m.toVector());			
	}
	return  salida;
}

private Vector <Object> listarProfesores(Vector<ProfesorVO> profesores){

	Vector<Object> salida = new Vector<Object>();
	
	for (Iterator <ProfesorVO> iter = profesores.iterator(); iter.hasNext();) {
		ProfesorVO p = (ProfesorVO)iter.next();
		salida.add(p.toVector());			
	}
	return  salida;
}



// Mensajes Error

private void mostrarMensajeErrorGuardar(){
	  JOptionPane.showMessageDialog(null, "No se pudo guardar", "ERROR", JOptionPane.ERROR_MESSAGE);
}

private void mostrarMensajeErrorActualizar(){
	JOptionPane.showMessageDialog(null, "No se pudo actualizar", "ERROR", JOptionPane.ERROR_MESSAGE);
}

}
